package Cache

import (
	"errors"
	"fmt"
	"github.com/go-redis/redis"
	"go.uber.org/zap"
	"lht-go-plugins/LhtLog"
	"lht-go-plugins/LhtSettings"
	"lht-go-plugins/internal/core"
	"strconv"
)

type RedisPlugin struct {
	*core.BasePlugin
	conf        LhtSettings.RedisConfig
	redisClient *redis.Client
}

func NewRedisPlugin() *RedisPlugin {
	return &RedisPlugin{
		BasePlugin: core.NewBasePlugin("redis", 1000),
	}
}

func (r *RedisPlugin) Init(cfg any) error {
	conf, ok := cfg.(*LhtSettings.RedisConfig)
	if !ok {
		return errors.New("invalid config type: expected *RedisConfig")
	}
	if conf == nil {
		return errors.New("redis config missing")
	}
	r.conf = *conf
	return nil
}

func (r *RedisPlugin) Start() error {
	// 创建连接池
	r.redisClient = redis.NewClient(&redis.Options{
		Addr:     r.conf.Host + ":" + strconv.Itoa(r.conf.Port), // Redis 服务器地址
		Password: r.conf.Password,                               // 密码
		PoolSize: r.conf.PoolSize,                               // 连接池中的最大连接数
		DB:       r.conf.Db,
	})
	_, err := r.redisClient.Ping().Result()
	if err != nil {
		LhtLog.Error(err.Error())
		return err
	}
	LhtLog.Info("Redis 连接成功", zap.String("addr", r.conf.Host))
	return r.BasePlugin.Start(r.handleData)
}

func (r *RedisPlugin) handleData(data []byte) {
	// 模拟 redis 操作
	fmt.Printf("[redis] recv data: %s\n", string(data))
}
